
package com.be.beadmin.product.service;

import com.be.beadmin.common.entity.PageEntity;
import com.be.beadmin.product.dto.WorkOrderProductPlanDto;
import com.be.beadmin.product.dto.input.*;
import com.be.beadmin.product.dto.output.*;
import com.be.beadmin.product.entity.ProductManufactInfor;
import com.be.beadmin.product.entity.WorkOrderInfor;
import com.be.beadmin.project.entity.BatchProduct;
import org.springframework.data.domain.Page;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
* @description 服务接口
* @author zjm
* @date 2023-03-19
**/
public interface ProductManufactInforService {

    /**
    * 分页的查询接口
    * @param pageEntity
    * @return
    */
    Page<ProductManufactInforEx> getProductManufactInforByPage(PageEntity pageEntity);

    /**
    * @param productManufactInforDto
    */
    void addProductManufactInfor(ProductManufactInforDto productManufactInforDto);

    /**
    * @param productManufactInforUpdateDto
    */
    void updateProductManufactInfor(ProductManufactInforUpdateDto productManufactInforUpdateDto);

    /**
    * @param id
    */
    void delProductManufactInfor(String id);

    /**
    * 删除多个角色
    * @param ids
    */
    void delProductManufactInfors (List<String> ids);

    /**
     * 自动排程
     * @param batchProductId
     * @return
     */
    String autoScheduling(List<String> batchProductId);

    /**
     * 分页的查询生产排程
     * @param pageEntity
     * @return
     */
    Page<Object> getProductManufactByPage(HttpServletRequest request,PageEntity pageEntity);



    /**
     * 检查是否工单是否超时
     * @param workOrderInfor
     */
    boolean checkPlanDateOut(WorkOrderInfor workOrderInfor);

    /**
     * 更新生产计划的时间-一起更新
     * @param productManufactInforUpdateDtos
     */
    void updateProductManufactInforAll(List<ProductManufactInforUpdateDto> productManufactInforUpdateDtos);

    /**
     *
     * @param productManufactDto
     */
    void updateProductManufactTime(ProductManufactDto productManufactDto);





    /**
     * 暂停工序执行
     *
     * @param request
     * @param productManufactInforId
     * @return
     */
    int pauseProductManufactExec(HttpServletRequest request, String productManufactInforId);

    /**
     * 计时开始
     * @param productManufactInforId
     * @return
     */
    int startTiming(String productManufactInforId);

    /**
     * 计时暂停
     * @param productManufactInforId
     * @return
     */
    int pauseTiming(String productManufactInforId);

    /**
     * 分页查询所有生产工序
     * @param pageEntity
     * @return
     */
    Page<ProductManufactExecuteEx> getProductManufactInforExecuteByPage(HttpServletRequest request, PageEntity pageEntity);

//    /**
//     * 分页查询所有生产工序By工单编号
//     * @param request
//     * @param pageEntity
//     * @param wo
//     * @return
//     */
//    Page<ProductManufactExecuteEx> getProductManufactInforExecuteByPageAndWo(HttpServletRequest request, PageEntity pageEntity, String wo);


    /**
     * 根据工单ID获取该工单下的所有生产工序
     * @param woId
     * @return
     */
    List<ProductManufactWorkTimeEx> getProductManufactExecInfosByWoId(String woId);

    /**
     * 对指定工单自动排程
     * @param woId
     */
    void autoScheduleByWoId(String woId);

    void autoScheduleByWoIds(List<String> woIds);

    /**
     * 对指定批次自动排程
     * @param batchPlanId
     */
    void autoScheduleByBatchPlanId(String batchPlanId);

    /**
     * 对指定柜体自动排程
     * @param batchProduct
     */
    void autoScheduleByBatchProduct(BatchProduct batchProduct);

    /**
     * 对多个批次批量自动排程
     * @param batchPlanIds
     */
    void autoScheduleByBatchPlanIds(List<String> batchPlanIds);

    /**
     * 变更生产计划
     * @param workOrderProductPlanDto
     */
    void updateProductPlanTime(WorkOrderProductPlanDto workOrderProductPlanDto,boolean isManual);

    /**
     * 根据工单Id工单下的所有生产排程计划
     * @param woId
     * @return
     */
    List<ProductPlanTimeEx> getProductPlansByWoId(String woId);

    /**
     * 根据id获取生产工序
     * @param processId
     */
    ProductManufactInfor getProductManufactById(String processId);

    int getProductManufactStateById(HttpServletRequest request, String productManufactInforId);

//    /**
//     * 手动排程
//     * @param workOrderProductPlanDto
//     */
//    void manualSchedule(WorkOrderProductPlanDto workOrderProductPlanDto);

    /**
     * 对多个工单排程
     * @param scheduleDto
     */
    void scheduleByWoIds(ScheduleDto scheduleDto, boolean isManual);

    /**
     * 获取该工序的实际计时时间(单位:分钟)
     * @param productManufactInforId
     * @return
     */
    float getManuTime(String productManufactInforId);

    /**
     * 根据工单编号查找工序名称
     * @param wo
     * @return
     */
    List<String> getProcessNamesByWo(String wo);

    /**
     *     // 校验一下 这些工单是否属于同一批次
     * @param woIds
     */
    void checkSameBatchPlan(List<String> woIds);

//    String getProductPlanAll(PageEntity pageEntity);
//    Page<ProductManufactExecuteEx> getProductManufactExecByPage(PageEntity pageEntity);
}